// 437. 路径总和 III

// 给定一个二叉树，它的每个结点都存放着一个整数值。
// 找出路径和等于给定数值的路径总数。
// 路径不需要从根节点开始，也不需要在叶子节点结束，但是路径方向必须是向下的（只能从父节点到子节点）。
// 二叉树不超过1000个节点，且节点数值范围是 [-1000000,1000000] 的整数。

// 示例：
// root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
//       10
//      /  \
//     5   -3
//    / \    \
//   3   2   11
//  / \   \
// 3  -2   1
// 返回 3。和等于 8 的路径有:

// 1.  5 -> 3
// 2.  5 -> 2 -> 1
// 3.  -3 -> 11

const { TreeNode } = require("./common.js");

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} sum
 * @return {number}
 */
var pathSum = function (root, sum) {
  const map = new Map();
  map.set(0, 1);
  return path(root, map, sum, 0);
};

function path(node, map, target, sum) {
  if (!node) {
    return 0;
  }
  sum += node.val;
  let g = map.get(sum);
  map.set(sum, g ? g + 1 : 1);
  console.log(map);
  g = map.get(sum - target);
  let res = g ? g : 0;
  res += path(node.left, map, target, sum);
  res += path(node.right, map, target, sum);
  map.set(sum, map.get(sum) - 1);
  return res;
}

console.log(
  pathSum(
    new TreeNode(
      10,
      new TreeNode(
        5,
        new TreeNode(
          3,
          new TreeNode(3, null, null),
          new TreeNode(-2, null, null)
        ),
        new TreeNode(2, null, new TreeNode(1, null, null))
      ),
      new TreeNode(-3, null, new TreeNode(11, null, null))
    ),
    8
  )
);
